package com.asyf.demo.demo.el;

import lombok.extern.slf4j.Slf4j;
import org.springframework.expression.EvaluationContext;
import org.springframework.expression.ExpressionParser;
import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.expression.spel.support.StandardEvaluationContext;

/**
 * @Author yjz
 * @Date 2023/1/29 17:16
 * 参考：https://www.cnblogs.com/wangzhongqiu/p/9530454.html
 * 常用方法示例： https://www.toutiao.com/article/6911604368844292620/
 * <p>
 * abac权限控制思路：
 * 1 固定用户的实体
 * 2 根据实体写el表达式
 * 3 el表达式是true说明有权限
 */
@Slf4j
public class ElDemo {

    public static void main(String[] args) {
//        test1();

        test3();

        test5();
    }

    /**
     * 属性和方法调用
     */
    private static void test3() {
        User user = UserFactory.buildUser();
        log.info("用户信息:{}", user);
        ExpressionParser parser = new SpelExpressionParser();
        EvaluationContext context = new StandardEvaluationContext();  // 表达式的上下文,
        context.setVariable("user", user);
        log.info("调用属性:{}", parser.parseExpression("#user.roleList[0].role").getValue(context, String.class));
        log.info("调用方法:{}", parser.parseExpression("#user.roleList.toString()").getValue(context, String.class));
        log.info("集合选择:{}", parser.parseExpression("#user.roleList.?[#this.id == 5]").getValue(context, Role.class));
        log.info("集合选择最后一个:{}", parser.parseExpression("#user.roleList.$[#this.id == 5]").getValue(context, Role.class));


        log.info("用户是否拥有id=5的角色:{}", parser.parseExpression("#user.roleList.$[#this.id == 5] != null").getValue(context, Boolean.class));

        log.info("用户是否拥有id=2的角色:{}", parser.parseExpression("'[Role(id=1, role=管理员), Role(id=2, role=销售员), Role(id=2, role=销售员2), Role(id=3, role=技术员)]' matches '.+2+.'").getValue(context, Boolean.class));

        log.info("正则测试:{}", parser.parseExpression("'5.00' matches '^-?\\d+(\\.\\d{2})?$'").getValue(Boolean.class));

        //注意：使用$能生效，使用?不生效
        log.info("操作符:{}", parser.parseExpression("(#user.roleList.$[#this.id == 23] != null) || (#user.roleList.$[#this.id == 5] != null)").getValue(context, Boolean.class));

        log.info("包含：{}", parser.parseExpression("#user.roleListStr ").getValue(context, String.class));

        log.info("包含：{}", parser.parseExpression("#user.roleListStr.contains({'23'})").getValue(context, Boolean.class));

        log.info("包含：{}", parser.parseExpression("#user.roleListStr.contains({'12'}) or #user.roleListStr.contains({'3'})").getValue(context, Boolean.class));

    }

    /**
     * 操作符
     */
    private static void test5() {
    }

    /**
     * 文本表达式
     */
    private static void test1() {
        ExpressionParser parser = new SpelExpressionParser();
        log.info("{}", parser.parseExpression("'hello'").getValue(String.class)); // hello , 注意单引号
        log.info("{}", parser.parseExpression("1.024E+3").getValue(Long.class));  // 1024  , 指数形式
        log.info("{}", parser.parseExpression("0xFFFF").getValue(Integer.class)); // 65535 , 十六进制
        log.info("{}", parser.parseExpression("true").getValue(Boolean.class));   // true
        log.info("{}", parser.parseExpression("null").getValue());
    }

}
